## This test makes sure we can extract the instrumentation map from an
## XRay-instrumented PIE file.

## Generated from the following source:
## __attribute__((xray_always_instrument)) void foo() {}
## __attribute__((xray_always_instrument)) void bar() {}
## __attribute__((xray_always_instrument)) void jar() {}
## Built with the following arguments:
## -target armv7a-linux-androideabi -nostdlib -fxray-instrument -fPIC -shared

--- !ELF
FileHeader:
  Class:           ELFCLASS32
  Data:            ELFDATA2LSB
  Type:            ET_DYN
  Machine:         EM_ARM
  Flags:           [ EF_ARM_SOFT_FLOAT, EF_ARM_EABI_VER5 ]
  Entry:           0x00000000000012B0
ProgramHeaders:
  - Type:     PT_LOAD
    Flags:    [ PF_R ]
    FirstSec: .rel.dyn
    LastSec:  .rel.dyn
    Align:    0x0000000000001000
  - Type:     PT_LOAD
    Flags:    [ PF_X, PF_R ]
    FirstSec: .text
    LastSec:  .text
    VAddr:    0x00000000000012B0
    Align:    0x0000000000001000
  - Type:     PT_LOAD
    Flags:    [ PF_W, PF_R ]
    FirstSec: xray_instr_map
    LastSec:  xray_fn_idx
    VAddr:    0x00000000000033CC
    Align:    0x0000000000001000
Sections:
  - Name:            .rel.dyn
    Type:            SHT_REL
    Flags:           [ SHF_ALLOC ]
    Address:         0x0000000000000200
    Link:            .dynsym
    AddressAlign:    0x0000000000000004
    Relocations:
      - Offset:          0x00000000000033CC
        Type:            R_ARM_RELATIVE
      - Offset:          0x00000000000033DC
        Type:            R_ARM_RELATIVE
      - Offset:          0x00000000000033EC
        Type:            R_ARM_RELATIVE
      - Offset:          0x00000000000033FC
        Type:            R_ARM_RELATIVE
      - Offset:          0x000000000000340C
        Type:            R_ARM_RELATIVE
      - Offset:          0x000000000000341C
        Type:            R_ARM_RELATIVE
      - Offset:          0x0000000000003430
        Type:            R_ARM_RELATIVE
      - Offset:          0x0000000000003434
        Type:            R_ARM_RELATIVE
      - Offset:          0x0000000000003438
        Type:            R_ARM_RELATIVE
      - Offset:          0x000000000000343C
        Type:            R_ARM_RELATIVE
      - Offset:          0x0000000000003440
        Type:            R_ARM_RELATIVE
      - Offset:          0x0000000000003444
        Type:            R_ARM_RELATIVE
      - Offset:          0x00000000000033F0
        Symbol:          _Z3barv
        Type:            R_ARM_ABS32
      - Offset:          0x0000000000003400
        Symbol:          _Z3barv
        Type:            R_ARM_ABS32
      - Offset:          0x00000000000033D0
        Symbol:          _Z3foov
        Type:            R_ARM_ABS32
      - Offset:          0x00000000000033E0
        Symbol:          _Z3foov
        Type:            R_ARM_ABS32
      - Offset:          0x0000000000003410
        Symbol:          _Z3jarv
        Type:            R_ARM_ABS32
      - Offset:          0x0000000000003420
        Symbol:          _Z3jarv
        Type:            R_ARM_ABS32
  - Name:            .text
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x00000000000012B0
    AddressAlign:    0x0000000000000004
    Size:            180
  - Name:            xray_instr_map
    Type:            SHT_PROGBITS
    Flags:           [ SHF_WRITE, SHF_ALLOC, SHF_LINK_ORDER ]
    Address:         0x00000000000033CC
    Link:            .text
    AddressAlign:    0x0000000000000001
    Content:         B0120000000000000001000000000000CC120000000000000101000000000000EC120000000000000001000000000000081300000000000001010000000000002813000000000000000100000000000044130000000000000101000000000000
  - Name:            xray_fn_idx
    Type:            SHT_PROGBITS
    Flags:           [ SHF_WRITE, SHF_ALLOC, SHF_LINK_ORDER ]
    Address:         0x0000000000003430
    Link:            .text
    AddressAlign:    0x0000000000000008
    Content:         CC330000EC330000EC3300000C3400000C3400002C340000
DynamicSymbols:
  - Name:            _Z3barv
    Type:            STT_FUNC
    Section:         .text
    Binding:         STB_GLOBAL
    Value:           0x00000000000012EC
    Size:            0x000000000000003C
  - Name:            _Z3foov
    Type:            STT_FUNC
    Section:         .text
    Binding:         STB_GLOBAL
    Value:           0x00000000000012B0
    Size:            0x000000000000003C
  - Name:            _Z3jarv
    Type:            STT_FUNC
    Section:         .text
    Binding:         STB_GLOBAL
    Value:           0x0000000000001328
    Size:            0x000000000000003C
...

# RUN: yaml2obj %s -o %t.so
# RUN: llvm-xray extract %t.so -s | FileCheck %s

# CHECK:      ---
# CHECK-NEXT: - { id: 1, address: 0x12B0, function: 0x12B0, kind: function-enter, always-instrument: true, function-name: 'foo()' }
# CHECK-NEXT: - { id: 1, address: 0x12CC, function: 0x12B0, kind: function-exit, always-instrument: true, function-name: 'foo()' }
# CHECK-NEXT: - { id: 2, address: 0x12EC, function: 0x12EC, kind: function-enter, always-instrument: true, function-name: 'bar()' }
# CHECK-NEXT: - { id: 2, address: 0x1308, function: 0x12EC, kind: function-exit, always-instrument: true, function-name: 'bar()' }
# CHECK-NEXT: - { id: 3, address: 0x1328, function: 0x1328, kind: function-enter, always-instrument: true, function-name: 'jar()' }
# CHECK-NEXT: - { id: 3, address: 0x1344, function: 0x1328, kind: function-exit, always-instrument: true, function-name: 'jar()' }
# CHECK-NEXT: ...

# RUN: llvm-xray extract -s --no-demangle %t.so | FileCheck --check-prefix=MANGLED %s

# MANGLED:      ---
# MANGLED-NEXT: - { id: 1, address: 0x12B0, function: 0x12B0, kind: function-enter, always-instrument: true, function-name: _Z3foov }
# MANGLED-NEXT: - { id: 1, address: 0x12CC, function: 0x12B0, kind: function-exit, always-instrument: true, function-name: _Z3foov }
# MANGLED-NEXT: - { id: 2, address: 0x12EC, function: 0x12EC, kind: function-enter, always-instrument: true, function-name: _Z3barv }
# MANGLED-NEXT: - { id: 2, address: 0x1308, function: 0x12EC, kind: function-exit, always-instrument: true, function-name: _Z3barv }
# MANGLED-NEXT: - { id: 3, address: 0x1328, function: 0x1328, kind: function-enter, always-instrument: true, function-name: _Z3jarv }
# MANGLED-NEXT: - { id: 3, address: 0x1344, function: 0x1328, kind: function-exit, always-instrument: true, function-name: _Z3jarv }
# MANGLED-NEXT: ...
